{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "> 本文由 [简悦 SimpRead](http://ksria.com/simpread/) 转码， 原文地址 [www.cnblogs.com](https://www.cnblogs.com/meandme/p/10062410.html)\n",
    "\n",
    "1    什么是 [OPC 协议](https://baike.baidu.com/item/opc/3875?fr=aladdin)？\n",
    "====================================================================\n",
    "\n",
    "为了便于自动化行业不同厂家的设备和应用程序能相互交换数据，定义了一个统一的接口函数，就是 OPC 协议规范。有了 OPC 就可以使用统一的方式去访问不同设备厂商的产品数据。\n",
    "\n",
    "OPC 基金会前前后后规定了不同的接口定义，如下：\n",
    "\n",
    "• OPC DA (Data Access, exchange of real-time values)\n",
    "\n",
    "• OPC A&E (Alarms & Events, exchange of alarms and events)\n",
    "\n",
    "• OPC HDA (Historical Data Access, exchange of historical values)\n",
    "\n",
    "• OPC XML DA (XML-based exchange of real-time values)\n",
    "\n",
    "2      [OPC DA](https://baike.baidu.com/item/OPC%E6%95%B0%E6%8D%AE%E8%AE%BF%E9%97%AE%E8%A7%84%E8%8C%83) 是什么？\n",
    "============================================================================================================\n",
    "\n",
    "OPC DA 指代的是 OPC 数据访问规范。它是由 OPC 基金会定义的其中一种通信规范, 定义了**实时数据**如何在**数据源**和**数据接收体**（比如 PLC, HMI）之间, 在**不知道彼此特定通信协议**的情况下**仍然进行交换、传输**。\n",
    "\n",
    "2.1     为什么 OPC DA 如此受欢迎？它和过去的**通信协议**有什么不同?\n",
    "--------------------------------------------\n",
    "\n",
    "**OPC DA 客户端 / 服务器结构服务器结构**是 OPC 基金会界定的首个结构。在 OPC DA 之前, 供应商的产品（设备、PLCs、HMIs）要求与这些产品相连接的任何设备或应用程序要自带 “特制驱动”, 以在第三方通信和所涉及的供应商产品之间进行数据传译。像这样基于“特制驱动” 的通讯存在许多问题, 其中最常见的有：成本高、将用户限制在某一特定供应商、由于每一个特制驱动都有其独有的处理方式而造成配置和维护的困难、由于新设备和应用程序的层出不穷而造成难于更新。相比之下, OPC DA 却可以**与任何实时数据源**相连接, 也**不需要为数据源**或**数据接收端**特制任何驱动程序。 因此, 数据接收器不需要了解数据源的本地协议或内部数据结构就可以进行读和写。\n",
    "\n",
    "2.2     OPC DA 规范是只有一种吗？\n",
    "------------------------\n",
    "\n",
    "很难说是或不是。因为 OPC DA 规范由 OPC 基金会来维护, 它们已经经过多次修订。主要版本包括:\n",
    "\n",
    "年份     版本     备注\n",
    "\n",
    "1996    1.0       初始规范。\n",
    "\n",
    "1997    DA 1.0a      数据访问（DA）, 该名称用于区分与其并行开发的其它规范。\n",
    "\n",
    "1998    DA 2.0 - DA 2.05a   多处规范澄清和修改。\n",
    "\n",
    "2003    DA 3.0 进一步补充和修改。\n",
    "\n",
    "考虑到有不同版本的 OPC 数据访问（OPC DA）规范, 关键问题是：这些版本反向兼容吗? 例如：OPC DA 1.0a 客户端是否可以与 OPC DA 3.0 OPC 服务器通讯？答案是：**这取决于具体情况。**\n",
    "\n",
    "2.3     数据访问 OPC 客户端及 OPC 服务器反向兼容性\n",
    "----------------------------------\n",
    "\n",
    "开发商编写反向兼容的 OPC 客户端及 OPC 服务器是值得推荐的, 同时这也是可以实现的。然而, 因为反向兼容性是可选功能, 而不是强制功能, 这意味着会有许多开发商选择（并且会继续）开发仅仅遵循一种或两种规范的 OPC DA 服务器, 而不是遵循所有规范。这样的话, 那些非反向兼容的 OPC 服务器及 OPC 客户端仍然向用户提供 OPC 所带来的些许优势, 但仅仅局限于特定版本的规范。_好消息是 MatirkonOPC 不仅开发完全反向兼容的 OPC 服务器, 也提供 OPC 数据管理产品（如： OPC Data Manager 及 OPC Security Gateway）。这些产品在非向后兼容的 OPC 客户端及服务器之间, 通过及时地在 OPC DA 不同规范之间转换实现彼此通讯。_\n",
    "\n",
    "3      如何使用 OPC 数据访问规范 (DA)\n",
    "===========================\n",
    "\n",
    "3.1     何时使用 OPC DA？\n",
    "--------------------\n",
    "\n",
    "简单的回答就是：用于需要传输实时数据的任何时刻。对于需要考虑的多种情形, 下表介绍了最常见的几种类型, 简述了一些难点, 并给出了利用标准 OPC 组件加以解决的相关建议。\n",
    "\n",
    "<table border=\"1\" cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td valign=\"top\" width=\"102\"><p><strong>数据源</strong></p></td><td valign=\"top\" width=\"76\"><p><strong>数据接收端（用户）</strong></p></td><td valign=\"top\" width=\"161\"><p><strong>OPC 解决问题</strong></p></td><td valign=\"top\" width=\"230\"><p><strong>相关建议</strong></p></td></tr><tr><td valign=\"top\" width=\"102\"><p>控制器（外部 PLC）</p></td><td valign=\"top\" width=\"76\"><p>应用程序（HMI）</p></td><td valign=\"top\" width=\"161\"><p>不同厂商的控制器均使用各自的通信协议。OPC 省去了 HMI 针对各控制器 “定制驱动器” 的需要。</p></td><td valign=\"top\" width=\"230\"><p>- 控制器：使用 OPC 服务器 for 控制器 X<br>- 应用程序：通常有内置的 OPC 客户端。如果没有, 则可使用适用于该应用程序 Y 的 OPC DA 客户端。</p></td></tr><tr><td valign=\"top\" width=\"102\"><p>控制器 / 设备</p></td><td valign=\"top\" width=\"76\"><p>控制器或控制设备</p></td><td valign=\"top\" width=\"161\"><p>备 OPC 服务器为您解决了控制器之间的通信, 因为各产品均采用各自厂商的通信协议, 不同于控制器与应用软件间的通信。</p></td><td valign=\"top\" width=\"230\"><p>- 数据源端、数据接收端的控制器 X 和 Y 分别需使用 OPC DA 服务器 for X 和 OPC DA 服务器 for Y。<br>- 使用 <a href=\"http://www.matrikonopc.com/products/opc-data-management/opc-data-manager.aspx?utm_campaign=OPCChina&amp;utm_medium=referral&amp;utm_source=baidu.com\">OPC Data Manager</a>, 在两控制器间实现有关实时数据的智能化传输。</p></td></tr><tr><td valign=\"top\" width=\"102\"><p>控制器 / 设备</p></td><td valign=\"top\" width=\"76\"><p>关系数据库</p></td><td valign=\"top\" width=\"161\"><p>关系数据库利用 “结构化查询语言”（SQL）通过 “开放数据库互联”（ODBC）协议进行通信；而控制器和控制设备则利用各自的自定义协议。找到一个贯穿两者的数据桥并非易事, 通常需要一定的技术经验才能建立起来。</p></td><td valign=\"top\" width=\"230\"><p>- 利用 <a href=\"http://www.matrikonopc.com/products/opc-archiving/opc-client-for-odbc.aspx?utm_campaign=OPCChina&amp;utm_medium=referral&amp;utm_source=baidu.com\">OPC DA Client for ODBC</a> 从 OPC 服务器中获取实时 OPC 数据, 通过 SQL/ODBC 将其准确地传输到数据库。<br>- 利用 OPC DA 服务器 for 设备 X 公开数据。<br><br>- 注：OPC DA 为双向式通信, 因此在必要时, 也可将实时数据从数据库写入设备或控制器中, 或将应用程序的数据写入 OPC 客户端。</p></td></tr><tr><td valign=\"top\" width=\"102\"><p>控制器 / 设备</p></td><td valign=\"top\" width=\"76\"><p>过程历时数据库（Historian）</p></td><td valign=\"top\" width=\"161\"><p>过程历史数据库采集的是实时数据, 它们通常有自己的通信协议和自定义驱动来收集各种设备或应用程序的数据。这里的难点是找到一个历史数据库不仅支持现有设备还要支持将来可能出现的数据源。</p></td><td valign=\"top\" width=\"230\"><p>历史数据库有其自己的标准协议, 且几乎所有的 historian 都有内置 OPC DA 客户端。 OPC Desktop Historian 就是这种有内在 OPC 接口历史数据库的其中一个。</p><p>- 对于数据源：用一个用于数据源 X 的 OPC DA 服务器即可。</p></td></tr><tr><td valign=\"top\" width=\"102\"><p>冗余的设备</p></td><td valign=\"top\" width=\"76\"><p>控制器 / 应用程序</p></td><td valign=\"top\" width=\"161\"><p>按照传统的方式, 如果控制器或应用程序不支持设备级冗余, 为保证设备的冗余性, 额外的硬件是需要的。</p></td><td valign=\"top\" width=\"230\"><p>- 对控制器：需要用于控制器 X 的 OPC 服务器。<br>- 不同的设备可以使用不同的 OPC 服务器。<br>- 使用 <a href=\"http://www.matrikonopc.cn/products/opc-data-management/opc-redundancy-broker.aspx\">OPC Redundancy Broker (ORB)</a> 来实施冗余机制。<br>- 对应用程序（如：HMI 或 Historian）：可以用 OPC 客户端用于应用程序 X。</p></td></tr><tr><td valign=\"top\" width=\"102\"><p>远程设备（数据采集与监视控制系统）SCADA: 例如，远程终端控制系统 RTU</p></td><td valign=\"top\" width=\"76\"><p>应用程序 / 控制器</p></td><td valign=\"top\" width=\"161\"><p>由于通讯故障和低频带宽, 与远程设备和数据来源之间的通信一般较为复杂, 同时也更昂贵。而自定义驱动程序的问题在于不同通信渠道的稳定性难以保障</p></td><td valign=\"top\" width=\"230\"><p>远程设备应该选择 SCADA 类的 OPC 服务器。跟一般现场应用的 OPC 服务器不同, 这类 OPC 服务器是专门为适应复杂的 SCADA 工作环境而设计的。（例如, <a href=\"http://www.matrikonopc.com/opc-drivers/302/base-driver-details.aspx?utm_campaign=OPCChina&amp;utm_medium=referral&amp;utm_source=baidu.com\">MatrikonOPC Server for SCADA Modbus</a>)</p></td></tr></tbody></table>\n",
    "\n",
    "3.2     可以用 OPC DA 传输历史数据吗？\n",
    "---------------------------\n",
    "\n",
    "**不能**。任何 OPC DA 都是专用于传输当前数据的。一旦当前数据已经被读, 下一数据的读取就会开始, OPC DA 没有为 OPC DA 客户端提供历史数据的接口。如果要传输历史数据, 需要使用同样基于 OPC 客户端 - 服务器结构 的 OPC 历史数据存取规范（OPC HDA）。\n",
    "\n",
    "3.3     同一供应商生产的 OPC DA 客户端程序可与不同供应商的 OPC 服务器搭配工作吗？\n",
    "---------------------------------------------------\n",
    "\n",
    "一般情况下是可以的, 在 OPC DA 客户端与服务器都支持同样版本的 OPC DA 规范（见上文）或者至少其中一个能够反向兼容的条件下。\n",
    "\n",
    "4      OPC 客户端 - 服务器结构\n",
    "======================\n",
    "\n",
    "OPC 通信结构是指包含一个或多个 OPC 客户端与服务器相互通信的集合。最简单的理解方式, 便是读懂如下这张数据流程图。它显示了数据由数据源从下至上到达数据接收体的过程。\n",
    "\n",
    " ![][img-0]\n",
    "\n",
    "**OPC 服务器**：在这个例子中, 如果数据源有一个内在的 OPC 客户端, 那么外在的 OPC 客户端就不是必须的了。\n",
    "\n",
    "**OPC 通信**：因为 OPC 基金组织定义了多种 OPC 通信规范 保证可以传送不同形式的数据信息, 所以**OPC 开发商和用户必须理解 OPC 服务器和客户端的通信**有时候**不局限于单一的数据访问形式**。这个概念的理解之所以重要, 是因为**同一种 OPC 服务器往往会支持多于一种的 OPC 数据访问规范。**\n",
    "\n",
    "[img-0]:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## OPC客户端 和OPC服务器之间有什么区别？\n",
    "\n",
    "OPC客户端请求数据，有时也想写入数据。如果允许的话，服务器会响应客户端的请求并提供数据，或接受其写入。最简单的形式就是这样。\n",
    "\n",
    "**可以将OPC服务器看作是协议转换器**，OPC服务器使用设备的专用协议与设备通信，然后使用OPC Classic和OPC UA规范定义的标准化格式提供对该数据的访问。\n",
    "\n",
    "通常情况下，OPC服务器在OPC客户端请求读取或写入数据之前不会执行任何操作。而某些OPC服务器可以配置为即使在没有客户端请求的情况下也可以从设备轮询数据。这通常是为了允许OPC服务器在其内部缓存中就具有当前数据并且在客户端请求它时就已经准备就绪（但是是以产生可能不需要的通信流量为代价。）目前许多OPC服务器为用户提供了灵活性，可以根据应用需求来进行配置。\n",
    "\n",
    "## 如果我的控制硬件供应商说他们支持OPC，那么为什么我还需要OPC服务器？\n",
    "\n",
    "当硬件供应商表示他们支持OPC时，通常并不意味着他们直接将OPC服务器嵌入到他们的硬件中。他们的意思是他们拥有OPC服务器软件，该软件在某个基于Windows的计算机上运行，​​​​该计算机与其硬件对话并使用一个或多个OPC标准公开数据。此外，对于某些硬件供应商，可能需要额外的许可费才能启用此OPC服务器功能。我们经常听到用户对这一点感到困惑。其实只是为了在销售时更好听一点，才会说“我们支持OPC”，所以在此需要澄清一下供应商所说的内容。\n",
    "\n",
    "现在，一些供应商开始利用多平台功能，并将OPC UA服务器直接嵌入到他们的PLC中。如果你的 HMI或SCADA软件支持OPC UA，那么这可能会非常方便。如果你的客户端应用程序不支持OPC UA，那么则可以使用OPC网关应用程序来帮助你从OPC UA 连接到 DA。\n",
    "\n",
    "---\n",
    "参考：\n",
    "\n",
    "1. [听说看了这篇文章就彻底搞懂了什么是OPC（上）](https://www.jianshu.com/p/35d919f41230)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {
    "height": "calc(100% - 180px)",
    "left": "10px",
    "top": "150px",
    "width": "273.6px"
   },
   "toc_section_display": true,
   "toc_window_display": true
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
